package com.sino.operation.util;

import lombok.Data;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * <p>
 *      该类为date类型的转换类   用于计算时间等
 * </p>
 * @author liuxiaoxian
 * @since 2021-04-03
 */
@Data
public class DateUtil {

    /**
     * @author yangfangyu
     * @since 2021-04-03
     * @description 方法用于时间对象转字符串
     * @paramer 需要转换的时间对象
     * @return 返回规定格式的日期字符串
     */
    public static String dateToString(Date date) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String format = simpleDateFormat.format(date);
        return format;
    }

    /**
     * @author yangfangyu
     * @since 2021-04-03
     * @description 方法用于字符串转时间对象
     * @paramer 需要转换的时间字符串  必须为指定模板的字符串
     * @return 返回时间对象
     */
    public static Date stringToDate(String date) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date transDate;
        try {
            transDate = simpleDateFormat.parse(date);
        } catch (ParseException e) {
            return null;
        }
        return transDate;
    }

    /**
     * @author yangfangyu
     * @since 2021-04-03
     * @description 毫秒转时间字符串方法
     * @paramer 需要转换的毫秒数
     * @return 指定格式的日期字符串
     */
    public static String longToDateString(Long l) {
        //将毫秒转化为字符串
        Date date = new Date(l);
        //调用内部方法  返回转化后的字符串
        return dateToString(date);
    }

    /**
     * @author yangfangyu
     * @since 2021-04-03
     * @description 指定格式的时间字符串转毫秒的方法
     * @paramer 需要转换的时间字符串
     * @return 毫秒数
     */
    public static Long StringToLong(String date) {
        //调用内部的方法
        return stringToDate(date).getTime();
    }

    /**
     * @author yangfangyu
     * @since 2021-04-03
     * @description 用于计算两个时间字符串的时间差(单位小时)
     * @paramer 需要转换的时间字符串
     * @return 两个时间相差的小时数 不足1小时的会向上取整
     */
    public static Integer maxTime(String beginTime, String endTime) {
        //将开始时间转化为date对象
        Date beginT = stringToDate(beginTime);
        //获取开始时间的时间戳
        long timeB = beginT.getTime();
        //获取结束时间的date对象
        Date endT = stringToDate(endTime);
        //获取结束时间的时间戳
        long timeE = endT.getTime();
        return getMaxHour(timeB, timeE);
    }

    /**
     * @author yangfangyu
     * @since 2021-04-03
     * @description 用于计算两个时间的时间差(单位小时)
     * @paramer 需要转换的时间字符串
     * @return 两个时间相差的小时数 不足1小时的会向上取整
     */
    public static Integer maxTime(Date beginTime, Date endTime) {
        long beginT = beginTime.getTime();
        long endT = endTime.getTime();
        return getMaxHour(beginT, endT);
    }

    /**
     * @author yangfangyu
     * @since 2021-04-03
     * @description 用于计算两个时间毫秒数的时间差(单位小时)
     * @paramer 需要转换的时间字符串
     * @return 两个时间相差的小时数 不足1小时的会向上取整
     */
    public static Integer maxTime(Long beginTime, Long endTime) {
        return maxTime(beginTime, endTime);
    }

    /**
     * @author yangfangyu
     * @since 2021-04-03
     * @description 私有的计算时间差方法  需要两个long值  分别为开始时间  结束时间
     * @paramer 需要转换的时间字符串
     * @return 两个时间相差的小时数 不足1小时的会向上取整
     */
    private static int getMaxHour(Long begin, Long end) {
        int l = (int) (end - begin);
        //计算时间差  不足1小时按1小时计算
        if (l % (1000 * 60 * 60) != 0) {
            //模60有余数 证明小时除不尽
            return l / (1000 * 60 * 60) + 1;
        }
        return l / (1000 * 60 * 60);
    }
}
